#ifndef ENCODER_H
#define ENCODER_H



typedef enum {
	Encoder_Resolution_10B,      //10bit	1024
	Encoder_Resolution_12B,      //12bit	4096
	Encoder_Resolution_14B,
	Encoder_Resolution_15B,
	Encoder_Resolution_16B,
	Encoder_Resolution_17B
} Encoder_Resolution_t;

typedef enum {
	Encoder_Rotation_1,
	Encoder_Rotation_16,
	Encoder_Rotation_32,
	Encoder_Rotation_64,
	Encoder_Rotation_200,
	Encoder_Rotation_1200
} Encoder_Rotation_t;

typedef enum {
	Encoder_1 = 0x01,
	Encoder_2 = 0x02,
	Encoder_3 = 0x03,
	Encoder_NUM
} Encoder_ID_t;

typedef enum {
	Encoder_CW=0x00,   //顺时针
	Encoder_CCW=0x01,  //逆时针
} Encoder_Mode_t;

typedef enum{
	Encoder_Return_Mode_1 = 0x00,   //无回传
	Encoder_Return_Mode_2 = 0x01,	//回传角速度
	Encoder_Return_Mode_3 = 0xAA,	//回传角度
}Encoder_Return_Mode_t


/* 该结构体用于存放云台的一些固定参数在config.c中更改后不再变化 */
typedef struct
{   

}PTZ_Param_t;



typedef struct 
{
	uint8_t can_id;                           //can id
	Encoder_Resolution_t resolution;          //分辨率
	BSP_CAN_t can;                            //can 句柄
	Encoder_Rotation_t rotation;              //绝对值圈数
	Encoder_Mode_t mode;                      //正反转
	uint16_t ReturnTime;   		              //回传时间
	double EncoderValue;       			      //编码器值
	double EncoderAngle;                      //编码器实际角度
	uint16_t VelocitySamplingTime;            //速度采样时间
}EncoderData_t;



void ReadEncoderValue(EncoderData_t *encoder);  //读取编码器值 指令0x01

void SetEncoderID(EncoderData_t *encoder,uint8_t new_id);  //设置编码器id 指令0x02

void SetCANCommunicationBaudRate(EncoderData_t *encoder, uint16_t canBaudRateMode);  //设置波特率 指令0x03

void SetEncoderMode(EncoderData_t *encoder, Encoder_Return_Mode_t encoderMode);  //设置编码器模式 指令0x04

void SetAutoFeedbackInterval(EncoderData_t *encoder, uint16_t AutoFeedbackInterval);  //设置自动回传间隔 指令0x05

void SetEncoderZeroPoint(EncoderData_t *encoder);     //设置零点 指令0x06

void SetEncoderRotationDirectiont(EncoderData_t *encoder, Encoder_Mode_t mode);  //设置编码器旋转方向 指令0x07

void ReadEncoderVirtualMultiTurnValue(EncoderData_t *encoder);  //读取编码器虚拟多圈值 指令0x08

void ReadEncoderVirtualTurnsValue(EncoderData_t *encoder);  //读取编码器虚拟圈数值 指令0x09

void ReadEncoderAngularVelocityValue(EncoderData_t *encoder);  //读取编码器虚拟角速度 指令0x0A

void SetEncoderAngularVelocitySamplingTime(EncoderData_t *encoder, uint16_t newVelocitySamplingTime);  //设置编码器角速度采样时间 指令0x0B
#endif
